﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SoftwareConsulting.BI11.Studio.Core.Project.Metadata;
using SoftwareConsulting.BI11.Studio.InternalServices;

namespace SoftwareConsulting.BI11.Studio.UI.ProjectExplorer
{
    /// <summary>
    /// Отображаемые типы объектов метаданных
    /// </summary>
    public struct MetadataObjectsVisibleTypes
    {
        private MetadataObjectKind _kind;//разновидность объектов
        private bool _all;//флаг всех объектов

        /// <summary>
        /// Возвращает/устанавливает вид объектов
        /// </summary>
        public MetadataObjectKind Kind
        {
            get
            {
                return _kind;
            }
            set
            {
                _kind = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг всех объектов
        /// </summary>
        public bool All
        {
            get
            {
                return _all;
            }
            set
            {
                _all = value;
            }
        }
    }

    /// <summary>
    /// Класс истории перемещения по объектам
    /// </summary>
    public class MetadataObjectsHistory : List<MetadataObjectsHistoryPoint>
    {
        /// <summary>
        /// Возвращает позицию точки с указанным описателем (первый встретившийся)
        /// </summary>
        /// <param name="desc"></param>
        /// <returns></returns>
        public int IndexOf(IMetadataObjectDescriptor desc)
        {
            return IndexOf(desc, 0);
        }

        /// <summary>
        /// Возвращает позицию точки с указанным описателем (первый встретившийся)
        /// </summary>
        /// <param name="desc"></param>
        /// <returns></returns>
        public int IndexOf(IMetadataObjectDescriptor desc, int startIndex)
        {
            int c = this.Count;
            Assert.FailIf(startIndex >= c, Assert.Id.Assert00257);
            for (int i = startIndex; i < c; i++)
            {
                MetadataObjectsHistoryPoint point = this[i];
                if (point.Descriptor.Equals(desc))
                    return i;
            }
            return -1;
        }
    }

    /// <summary>
    /// Точка истории перемещения по объектам
    /// </summary>
    public struct MetadataObjectsHistoryPoint
    {
        private IMetadataObjectDescriptor _descriptor; //описатель объекта
        private MetadataObjectsHistoryPointKind _kind; //вид точки

        /// <summary>
        /// Возвращает описатель объекта
        /// </summary>
        public IMetadataObjectDescriptor Descriptor
        {
            get
            {
                return _descriptor;
            }            
        }        

        /// <summary>
        /// Возвращает вид точки
        /// </summary>
        public MetadataObjectsHistoryPointKind Kind
        {
            get
            {
                if (Descriptor.Kind != MetadataObjectKind.Folder)
                {
                    //не контейнерный объект, значит простой объект, что бы мы там ни запоминали
                    return MetadataObjectsHistoryPointKind.SimpleMetadataObject;
                }
                return _kind;
            }
        }

        /// <summary>
        /// Конструктор структуры
        /// </summary>
        /// <param name="newDescriptor"></param>
        /// <param name="newKind"></param>
        public MetadataObjectsHistoryPoint(IMetadataObjectDescriptor newDescriptor, MetadataObjectsHistoryPointKind newKind)
        {
            _descriptor = newDescriptor;
            _kind = newKind;
        }
    }

    /// <summary>
    /// Вид точки истории перемещения по объектам
    /// </summary>
    public enum MetadataObjectsHistoryPointKind
    {
        None = 0,
        SimpleMetadataObject = 1,
        OpenedContainerObject = 2
    }
}
